package com.xcm.dao;

import com.github.pagehelper.Page;
import com.xcm.model.TbProgramJson;
import com.xcm.model.dto.AuthProgramJsonDTO;
import com.xcm.model.dto.ProgramJsonListDTO;
import com.xcm.model.dto.SingleProgramDetailReportDTO;
import com.xcm.model.dto.WholeProgramReportDTO;
import com.xcm.model.vo.ProgramJsonStatVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ProgramJsonMapper {
	/**
	 * 保存节目JSON
	 *
	 * @param programJson TbProgramJson类型对象
	 */
	void saveProgramJson(TbProgramJson programJson);

	/**
	 * 通过xc版本获取节目Json
	 *
	 * @param xcVersion xc版本
	 * @return TbProgramJson
	 */
	TbProgramJson getProgramJsonByXcVersion(String xcVersion);

	/**
	 * 根据ID修改节目下载状态
	 *
	 * @param programJsonId 节目JsonId
	 */
	void updateProgramJsonDownStateById(@Param("downState") Integer downState, @Param("programJsonId") Long programJsonId);

	/**
	 * 更新节目Json
	 *
	 * @param programJson TbProgramJson类型对象
	 */
	void updateProgramJson(TbProgramJson programJson);

	/**
	 * 获取节目Json列表(分页)
	 * listProgramJsonByPage
	 *
	 * @param timeType        筛选时间类型称
	 * @param startTime       筛选时间-开始
	 * @param endTime         筛选时间-结束
	 * @param deviceDownState 终端下载状态
	 * @param checkType       校验状态
	 * @param publishId       发布Id
	 * @return Page<ProgramJsonListDTO>
	 */
	Page<ProgramJsonListDTO> listProgramJsonByPage(@Param(value = "timeType") String timeType, @Param(value = "startTime") Long startTime, @Param(value = "endTime") Long endTime,
	                                               @Param(value = "deviceDownState") String deviceDownState, @Param(value = "checkType") String checkType, @Param(value = "publishId") Long publishId);

	/**
	 * 获取终端下载广告成功数量（所有终端下载完毕该批次广告，成功数量+1,多一个终端对应一批广告，有一个失败即失败数+1）
	 *
	 * @param deviceDownState 终端下载状态(0:已下载 1:下载中 2:下载失败)
	 * @return Long
	 */
	Long getProgramJsonConutByDeviceDownState(Integer deviceDownState);

	/**
	 * 通过下载状态获取广告发布数
	 *
	 * @param downloadState 下载状态(0:已下载 1:下载中 2:下载失败)
	 * @return Long
	 */
	Long getProgramJsonCountByDownloadState(Integer downloadState);


	/**
	 * 获取单个节目详细报表
	 *
	 * @param receiveStartTime 接收开始时间
	 * @param receiveEndTime   接收结束时间
	 * @param programJsonId    节目主键ID
	 * @return PageInfo<SingleProgramDetailReportVO>
	 */
	Page<SingleProgramDetailReportDTO> listSingleProgramDetailReportByPage(@Param("receiveStartTime") Long receiveStartTime, @Param("receiveEndTime") Long receiveEndTime, @Param("programJsonId") Long programJsonId);

	/**
	 * 获取节目相关统计信息
	 */
	ProgramJsonStatVO getProgramJsonStat();

	/**
	 * 通过校验状态获取广告数
	 *
	 * @param jsonAuth 校验状态(0:验证通过 1:验证失败)
	 * @return Long
	 */
	Long getProgramJsonConutByJsonAuth(Integer jsonAuth);

	/**
	 * 获取节目总数
	 *
	 * @return Long
	 */
	Long getProgramJsonCount();

	/**
	 * 获取整体广告分页列表
	 *
	 * @param timeType      1:接收时间 2:完成时间
	 * @param longStartTime 开始时间
	 * @param longEndTime   结束时间
	 * @param publishWay    发布方式 1：定时发布(当前只有定时发布) 2:预约发布
	 * @param programJsonId 发布Id
	 * @return
	 */
	Page<WholeProgramReportDTO> listWholeProgramReportByPage(@Param("timeType") Integer timeType,
	                                                         @Param("startTime") Long longStartTime,
	                                                         @Param("endTime") Long longEndTime,
	                                                         @Param("publishWay") Integer publishWay,
	                                                         @Param("programJsonId") Long programJsonId);


	/**
	 * 获取校验不通过节目json
	 *
	 * @return List<AuthProgramJsonDTO>
	 */
	List<AuthProgramJsonDTO> listProgramJsonByJsonAuth(Integer jsonAuth);

	/**
	 * 通过xc版本更新节目校验状态
	 *
	 * @param jsonAuth  校验状态
	 * @param xcVersion xc版本
	 */
	void updateProgramJsonAuthByXcVersion(@Param("jsonAuth") Integer jsonAuth, @Param("xcVersion") String xcVersion);
}
